﻿// See https://aka.ms/new-console-template for more information
await Task.Yield();
//交出cpu时间片，它只会将资源交给同一个处理器上运行的线程
//出让时间片之后，马上又会被重新分配时间片
//出让线程
//假设你有一个异步任务在程序的一开始就执行，但是这个任务中的await在最结尾，为了让这个异步任务早早的将线程返回，使用await Task.yield（）创建一个空任务，其目的是为了用await让线程早早的返回
//创建一个空的Task任务，以达到出让线程的目的
//参考博客https://www.cnblogs.com/dudu/p/task-yield.html

//在存储用户的密码的md5密文时，应加盐处理，且每个用户的盐值都必须足够长且不同
//根据网络上公开可查询的彩虹表，可以认为任何数字+字母的七位数密码组合的md5密文都已经被彩虹表破解。
//而如果系统中采取一个固定的盐值，会导致相同密码的用户的密文是一样的。

//在切割字符串时建议使用AsSpan而不是Substring
//因为string是不可变类型，根据.net源码实现方式，使用Substring实际上将你切割范围的字符串创建为一份新的副本变量重新赋值给你，因此产生了多余的内存开销。
//而AsSpan是创建一个指定切割范围的只读指针引用传递给你，并没有多余的内存开销
string str = "123-123-123";
var s = str.Substring(str.IndexOf('-'));
var s1 = str.AsSpan(str.IndexOf('-')).ToString();
Console.WriteLine(s);
Console.WriteLine(s1);
Console.WriteLine("Hello, World!");